package tbs.framework.async.task;

import tbs.framework.utils.StrUtil;

/**
 * 任务可取消
 *
 * @author abstergo
 */
public interface ICancelable {
    /**
     * 取消任务
     * @param cancelMsg 取消原因
     */
    void cancel(String cancelMsg);

    /**
     * 获取取消原因
     *
     * @return
     */
    String cancelReason();

    /**
     * 是否被取消
     *
     * @return
     */
    boolean isCanceled();

    /**
     * 中断任务
     * @throws InterruptedException 任务被取消抛出异常
     */
    default void interrupt() throws InterruptedException {
        if (isCanceled()) {
            throw new InterruptedException(StrUtil.isEmpty(cancelReason()) ? "任务被取消" : cancelReason());
        }
    }
}
